﻿#ifndef EPOLLER_H
#define EPOLLER_H

#define MAX_EPOLL_EVENTS 1024

#include <sys/epoll.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unordered_map>
#include <vector>
#include <functional>
#include <unistd.h>


class Channel;

class Epoller
{
private:
    // epoll的句柄
    int m_epfd;
    // epoll的事件数组
    struct epoll_event m_events[MAX_EPOLL_EVENTS];
    // 保存所有channel的句柄和对应的channel
    std::unordered_map<int, Channel *> m_channels;
private:
    // 判断channel是否存在
    bool isHasChannel(Channel *channel);
    // 更新事件（包含添加、修改、删除）
    void update(Channel *channel, int op);
public:
    // 构造函数
    Epoller();
    // 析构函数
    ~Epoller();
    // 更新事件
    void updateEvent(Channel *channel);
    // 等待事件
    void waitEvent(std::vector<Channel *> &actives);
    // 删除事件
    void removeEvent(Channel *channel);
};



#endif
